package com.qqbot.utils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 常用集合工具类
 *
 * @author 付亚全
 */
public class CollectionUtil {

    /**
     * 空集合判断
     *
     * @param collections 原始集合
     * @param <T>         对象类型
     * @return true：集合为空；false：集合非空。
     */
    public static <T> boolean isEmpty(final Collection<T> collections) {
        if (null == collections || collections.size() <= 0) {
            return true;
        }
        return false;
    }

    /**
     * 非空集合判断
     *
     * @param collections 原始集合
     * @param <T>         对象类型
     * @return true：集合非空；false：集合为空。
     */
    public static <T> boolean isNotEmpty(final Collection<T> collections) {
        return !isEmpty(collections);
    }

    /**
     * 包装集合
     * 如果集合为null，转换成空集合
     *
     * @param lists 原始集合对象
     * @param <T>   对象类型
     * @return 非null集合
     */
    public static <T> List<T> emptyWrap(final List<T> lists) {
        if (null != lists) {
            return lists;
        }
        return new ArrayList<T>();
    }

    /**
     * 排列组合
     * 本质-位运算
     *
     * @param list
     * @return
     */
    public static Set<Set<String>> combination(List<Long> list) {
        Set<Set<String>> result = new HashSet<>();
        if (CollectionUtil.isEmpty(list)) {
            return result;
        }
        for (int i = 1; i < Math.pow(2, list.size()) - 1; i++) {
            Set<String> eligibleCollections = new HashSet<>();
            // 依次将数字 i 与 2^n 按位与，判断第 n 位是否为 1
            for (int j = 0; j < list.size(); j++) {
                if ((i & (int) Math.pow(2, j)) == Math.pow(2, j)) {
                    eligibleCollections.add(String.valueOf(list.get(j)));
                }
            }
            result.add(eligibleCollections);
        }
        result.add(new HashSet<String>(list.stream().map(i -> String.valueOf(i)).collect(Collectors.toList())));
        return result;
    }
}
